package com.ruoyi.pos.service.transaction;

import com.ruoyi.pos.domain.dto.transaction.request.SaleTicketCreateRequest;
import com.ruoyi.pos.domain.dto.transaction.request.SaleTicketQueryRequest;
import com.ruoyi.pos.domain.dto.transaction.response.SaleTicketResponse;
import com.ruoyi.pos.domain.dto.common.response.BasePageResponse;

import java.util.List;

/**
 * POS销售小票Service接口
 * 
 * @author ruoyi
 * @date 2025-01-30
 */
public interface IPosSaleTicketService {

    /**
     * 创建销售小票
     * 
     * @param request 销售小票创建请求
     * @return 销售小票响应
     */
    SaleTicketResponse createSaleTicket(SaleTicketCreateRequest request);


    /**
     * 根据ID查询销售小票
     * 
     * @param transactionId 销售ID
     * @return 销售小票响应
     */
    SaleTicketResponse getSaleTicketById(Long transactionId);

    /**
     * 根据流水号查询销售小票
     * 
     * @param transactionNo 销售流水号
     * @return 销售小票响应
     */
    SaleTicketResponse getSaleTicketByNo(String transactionNo);

    /**
     * 分页查询销售小票
     * 
     * @param request 查询请求
     * @return 分页响应
     */
    BasePageResponse<SaleTicketResponse> querySaleTickets(SaleTicketQueryRequest request);

    /**
     * 更新销售小票状态
     * 
     * @param transactionId 销售ID
     * @param status 新状态
     * @return 是否成功
     */
    boolean updateSaleTicketStatus(Long transactionId, String status);

    /**
     * 取消销售小票
     * 
     * @param transactionId 销售ID
     * @param reason 取消原因
     * @return 是否成功
     */
    boolean cancelSaleTicket(Long transactionId, String reason);

    /**
     * 验证销售小票数据完整性
     * 
     * @param request 销售小票创建请求
     * @return 验证结果
     */
    boolean validateSaleTicketData(SaleTicketCreateRequest request);

    /**
     * 验证退货权限
     * 
     * @param transactionId 原销售ID
     * @param cashierId 收银员ID
     * @return 是否有退货权限
     */
    boolean validateRefundPermission(Long transactionId, Long cashierId);

    /**
     * 获取可退货的交易
     * 
     * @param transactionNo 销售流水号
     * @return 可退货的交易信息
     */
    SaleTicketResponse getRefundableTransaction(String transactionNo);

    /**
     * 验证是否可退货
     * 
     * @param transactionId 原销售ID
     * @return 是否可退货
     */
    boolean validateRefundable(Long transactionId);

    /**
     * 获取退货记录
     * 
     * @param originalTransactionId 原销售ID
     * @return 退货记录列表
     */
    List<SaleTicketResponse> getRefundRecords(Long originalTransactionId);

    /**
     * 获取收银员退货记录
     * 
     * @param cashierId 收银员ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 退货记录列表
     */
    List<SaleTicketResponse> getCashierRefundRecords(Long cashierId, String startTime, String endTime);

    /**
     * 根据原交易获取所有退货
     * 
     * @param originalTransactionId 原交易ID
     * @return 退货记录列表
     */
    List<SaleTicketResponse> getRefundsByOriginalTransaction(Long originalTransactionId);
}
